package org.hk.utils;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.hk.entity.Admin;
import org.hk.studyMybatis.mapper.AdminMapper;

import java.io.IOException;
import java.io.Reader;
import java.util.List;

public class MybatisUtils {
    /**
     * 启动MyBatis去加载配置文件 1.java.io.Reader 2.Resources 3.SqlSessionFactory
     */
    private static Reader reader;
    private static SqlSessionFactory sqlSessionFactory;

    static {
        try {
            reader = Resources.getResourceAsReader("config.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);//把xml全部变程了java类的对象存起来
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //一个专用方法如何转变为通用的泛型方法
    public static AdminMapper getMapper1(Class<AdminMapper> clazz){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        return (AdminMapper) sqlSession.getMapper(clazz);//从存的对象中取一个来用
    }
    //因为泛型方法是指方法定义的时候 并没有具体的类型，但是有具体的流程，这个结果收到参数类型的影响，所以用T来占位置，T替那个类型占位置，这个方法在执行时候就是那个
    // 类型的专用方法
    public static <T> T getMapper(Class<T> clazz){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        return  sqlSession.getMapper(clazz);//从存的对象中取一个来用
    }

    public static void main(String[] args) {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        AdminMapper adminMapper = sqlSession.getMapper(AdminMapper.class);//从存的对象中取一个来用
        List<Admin> admins = adminMapper.getAll();
        for(Admin admin:admins){
            System.out.println(admin);
        }

    }
}
